@@ -52,7 +52,7 @@ class UserInfo(BaseModelMixin): |
||
52 | 52 |
@property |
53 | 53 |
def data(self): |
54 | 54 |
try: |
55 |
- user = IsolationPointUserInfo.objects.get(user_id=self.user_id, status=True).userdata |
|
55 |
+ user = IsolationPointUserInfo.objects.get(user_id=self.user_id, member_id='', status=True).userdata |
|
56 | 56 |
except IsolationPointUserInfo.DoesNotExist: |
57 | 57 |
user = {} |
58 | 58 |
|
@@ -18,17 +18,17 @@ def upload_antigen(request): |
||
18 | 18 |
detect_at = tc.string_to_datetime(detect_at, format='%Y-%m-%d %H:%M:%S') |
19 | 19 |
|
20 | 20 |
try: |
21 |
- user = IsolationPointUserInfo.objects.get(fields__icontains=phone, status=True) |
|
21 |
+ user = IsolationPointUserInfo.objects.get(fields__icontains=phone, member_id='', status=True) |
|
22 |
+ user.detect_at = detect_at |
|
23 |
+ user.antigen_result = result |
|
24 |
+ user.save() |
|
22 | 25 |
except IsolationPointUserInfo.DoesNotExist: |
23 | 26 |
user = None |
24 | 27 |
|
25 |
- user.detect_at = detect_at |
|
26 |
- user.antigen_result = result |
|
27 |
- user.save() |
|
28 |
- |
|
29 | 28 |
AntigenMeasureLogInfo.objects.create( |
30 | 29 |
point_id=user.point_id if user else '', |
31 | 30 |
user_id=user.user_id if user else '', |
31 |
+ member_id=user.member_id if user else '', |
|
32 | 32 |
macid=macid, |
33 | 33 |
user_name=user_name, |
34 | 34 |
phone=phone, |
@@ -0,0 +1,45 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from __future__ import division |
|
4 |
+ |
|
5 |
+from django_logit import logit |
|
6 |
+from django.conf import settings |
|
7 |
+from django_response import response |
|
8 |
+ |
|
9 |
+from equipment.models import FamilyMemberInfo |
|
10 |
+ |
|
11 |
+ |
|
12 |
+@logit |
|
13 |
+def mp_bind_family_member(request): |
|
14 |
+ user_id = request.POST.get('user_id', '') |
|
15 |
+ identity_card_name = request.POST.get('identity_card_name', '') |
|
16 |
+ identity_card_number = request.POST.get('identity_card_number', '') |
|
17 |
+ relation = request.POST.get('relation', '') |
|
18 |
+ |
|
19 |
+ FamilyMemberInfo.objects.create( |
|
20 |
+ user_id=user_id, |
|
21 |
+ identity_card_name=identity_card_name, |
|
22 |
+ identity_card_number=identity_card_number, |
|
23 |
+ relation=relation |
|
24 |
+ ) |
|
25 |
+ |
|
26 |
+ return response() |
|
27 |
+ |
|
28 |
+@logit |
|
29 |
+def mp_family_member_list(request): |
|
30 |
+ user_id = request.POST.get('user_id', '') |
|
31 |
+ members = FamilyMemberInfo.objects.filter(user_id=user_id, status=True) |
|
32 |
+ |
|
33 |
+ members = [member.data for member in members] |
|
34 |
+ return response(data={ |
|
35 |
+ 'members': members |
|
36 |
+ }) |
|
37 |
+ |
|
38 |
+@logit |
|
39 |
+def mp_delete_family_member(request): |
|
40 |
+ user_id = request.POST.get('user_id', '') |
|
41 |
+ member_id = request.POST.get('member_id', '') |
|
42 |
+ |
|
43 |
+ FamilyMemberInfo.objects.filter(user_id=user_id, member_id=member_id).update(status=False) |
|
44 |
+ |
|
45 |
+ return response() |
@@ -55,6 +55,7 @@ def update_point_info(request): |
||
55 | 55 |
def get_point_fields(request): |
56 | 56 |
point_id = request.POST.get('point_id', '') |
57 | 57 |
user_id = request.POST.get('user_id', '') |
58 |
+ member_id = request.POST.get('member_id', '') |
|
58 | 59 |
|
59 | 60 |
try: |
60 | 61 |
point = IsolationPointInfo.objects.get(point_id=point_id, status=True) |
@@ -62,7 +63,7 @@ def get_point_fields(request): |
||
62 | 63 |
return response(IsolationPointStatusCode.ISOLATIONPOINT_NOT_FOUND) |
63 | 64 |
|
64 | 65 |
try: |
65 |
- ipui = IsolationPointUserInfo.objects.get(user_id=user_id, point_id=point_id) |
|
66 |
+ ipui = IsolationPointUserInfo.objects.get(user_id=user_id, member_id=member_id, point_id=point_id) |
|
66 | 67 |
except IsolationPointUserInfo.DoesNotExist: |
67 | 68 |
ipui = None |
68 | 69 |
|
@@ -77,11 +78,12 @@ def get_point_fields(request): |
||
77 | 78 |
def save_point_fields(request): |
78 | 79 |
point_id = request.POST.get('point_id', '') |
79 | 80 |
user_id = request.POST.get('user_id', '') |
81 |
+ member_id = request.POST.get('member_id', '') |
|
80 | 82 |
fields = get_query_value(request, 'fields', val_cast_type='listjson') |
81 | 83 |
|
82 |
- IsolationPointUserInfo.objects.exclude(point_id=point_id).update(status=False) |
|
84 |
+ IsolationPointUserInfo.objects.filter(user_id=user_id, member_id=member_id).exclude(point_id=point_id).update(status=False) |
|
83 | 85 |
|
84 |
- IsolationPointUserInfo.objects.update_or_create(point_id=point_id, user_id=user_id, defaults={ |
|
86 |
+ IsolationPointUserInfo.objects.update_or_create(point_id=point_id, user_id=user_id, member_id=member_id, defaults={ |
|
85 | 87 |
'fields': fields, |
86 | 88 |
'status': True, |
87 | 89 |
}) |
@@ -93,9 +95,10 @@ def save_point_fields(request): |
||
93 | 95 |
def bind_eqpt(request): |
94 | 96 |
macid = request.POST.get('macid', '') |
95 | 97 |
user_id = request.POST.get('user_id', '') |
98 |
+ member_id = request.POST.get('member_id', '') |
|
96 | 99 |
|
97 | 100 |
try: |
98 |
- ipui = IsolationPointUserInfo.objects.get(user_id=user_id, status=True) |
|
101 |
+ ipui = IsolationPointUserInfo.objects.get(user_id=user_id, member_id=member_id, status=True) |
|
99 | 102 |
except IsolationPointUserInfo.DoesNotExist: |
100 | 103 |
return response(IsolationPointStatusCode.ISOLATIONPOINT_USER_NOT_FOUND) |
101 | 104 |
|
@@ -122,6 +125,7 @@ def bind_eqpt(request): |
||
122 | 125 |
def mp_upload_temperature(request): |
123 | 126 |
macid = request.POST.get('macid', '') |
124 | 127 |
userid = request.POST.get('user_id', '') |
128 |
+ member_id = request.POST.get('member_id', '') |
|
125 | 129 |
temperature = request.POST.get('temperature', '') |
126 | 130 |
dry_cough_status = request.POST.get('dry_cough_status', False) |
127 | 131 |
weak_status = request.POST.get('weak_status', False) |
@@ -132,13 +136,13 @@ def mp_upload_temperature(request): |
||
132 | 136 |
is_filled = request.POST.get('is_filled', False) |
133 | 137 |
|
134 | 138 |
try: |
135 |
- ipui = IsolationPointUserInfo.objects.get(user_id=userid, status=True) |
|
139 |
+ ipui = IsolationPointUserInfo.objects.get(user_id=userid, member_id=member_id, status=True) |
|
136 | 140 |
except IsolationPointUserInfo.DoesNotExist: |
137 |
- ThermometerMeasureLogInfo.objects.create(point_id='', macid=macid, user_id=userid, temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MP, chg_sta=False, ignore_temperature=False, ignore_fever_temperature=False, upload_temperature_info='', dry_cough_status=dry_cough_status, weak_status=weak_status, sore_throat_status=sore_throat_status, smell_taste_loss_status=smell_taste_loss_status, diarrhea_status=diarrhea_status, |
|
141 |
+ ThermometerMeasureLogInfo.objects.create(point_id='', macid=macid, user_id=userid, member_id=member_id, temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MP, chg_sta=False, ignore_temperature=False, ignore_fever_temperature=False, upload_temperature_info='', dry_cough_status=dry_cough_status, weak_status=weak_status, sore_throat_status=sore_throat_status, smell_taste_loss_status=smell_taste_loss_status, diarrhea_status=diarrhea_status, |
|
138 | 142 |
blood_oxygen_saturation=blood_oxygen_saturation, is_filled=is_filled) |
139 | 143 |
return response() |
140 | 144 |
|
141 |
- ThermometerMeasureLogInfo.objects.create(point_id=ipui.point_id, macid=macid, user_id=userid, temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MP, chg_sta=False, ignore_temperature=False, ignore_fever_temperature=False, upload_temperature_info='', dry_cough_status=dry_cough_status, weak_status=weak_status, sore_throat_status=sore_throat_status, smell_taste_loss_status=smell_taste_loss_status, diarrhea_status=diarrhea_status, blood_oxygen_saturation=blood_oxygen_saturation, is_filled=is_filled) |
|
145 |
+ ThermometerMeasureLogInfo.objects.create(point_id=ipui.point_id, macid=macid, user_id=userid, member_id=member_id,temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MP, chg_sta=False, ignore_temperature=False, ignore_fever_temperature=False, upload_temperature_info='', dry_cough_status=dry_cough_status, weak_status=weak_status, sore_throat_status=sore_throat_status, smell_taste_loss_status=smell_taste_loss_status, diarrhea_status=diarrhea_status, blood_oxygen_saturation=blood_oxygen_saturation, is_filled=is_filled) |
|
142 | 146 |
|
143 | 147 |
ipui.observed_ymds = list(set(ipui.observed_ymds + [tc.local_string(format='%Y-%m-%d')])) |
144 | 148 |
ipui.observed_days = len(ipui.observed_ymds) |
@@ -159,11 +163,12 @@ def mp_upload_temperature(request): |
||
159 | 163 |
@logit |
160 | 164 |
def mp_temperature_list(request): |
161 | 165 |
user_id = request.POST.get('user_id', '') |
166 |
+ member_id = request.POST.get('member_id', '') |
|
162 | 167 |
point_id = request.POST.get('point_id', '') |
163 | 168 |
page = request.POST.get('page', 1) |
164 | 169 |
num = request.POST.get('num', 20) |
165 | 170 |
|
166 |
- logs = ThermometerMeasureLogInfo.objects.filter(point_id=point_id, user_id=user_id, status=True).order_by('-created_at') |
|
171 |
+ logs = ThermometerMeasureLogInfo.objects.filter(point_id=point_id, user_id=user_id, member_id=member_id, status=True).order_by('-created_at') |
|
167 | 172 |
count = logs.count() |
168 | 173 |
logs, left = pagination(logs, page, num) |
169 | 174 |
|
@@ -208,10 +213,11 @@ def admin_user_results(request): |
||
208 | 213 |
@logit |
209 | 214 |
def admin_point_user_unbind(request): |
210 | 215 |
user_id = request.POST.get('user_id', '') |
216 |
+ member_id = request.POST.get('member_id', '') |
|
211 | 217 |
active = int(request.POST.get('active', 0)) |
212 | 218 |
|
213 | 219 |
try: |
214 |
- ipui = IsolationPointUserInfo.objects.get(user_id=user_id, status=True) |
|
220 |
+ ipui = IsolationPointUserInfo.objects.get(user_id=user_id, member_id=member_id, status=True) |
|
215 | 221 |
except IsolationPointUserInfo.DoesNotExist: |
216 | 222 |
return response() |
217 | 223 |
|
@@ -235,11 +241,12 @@ def admin_point_user_unbind(request): |
||
235 | 241 |
@logit |
236 | 242 |
def admin_point_user_remark(request): |
237 | 243 |
user_id = request.POST.get('user_id', '') |
244 |
+ member_id = request.POST.get('member_id', '') |
|
238 | 245 |
remark = request.POST.get('remark', '') |
239 | 246 |
|
240 | 247 |
# 存放历史备注记录 |
241 | 248 |
try: |
242 |
- ipui = IsolationPointUserInfo.objects.get(user_id=user_id, status=True) |
|
249 |
+ ipui = IsolationPointUserInfo.objects.get(user_id=user_id, member_id=member_id, status=True) |
|
243 | 250 |
except IsolationPointUserInfo.DoesNotExist: |
244 | 251 |
return response() |
245 | 252 |
|
@@ -253,11 +260,12 @@ def admin_point_user_remark(request): |
||
253 | 260 |
@logit |
254 | 261 |
def admin_point_user_temperature_history(request): |
255 | 262 |
user_id = request.POST.get('user_id', '') |
263 |
+ member_id = request.POST.get('member_id', '') |
|
256 | 264 |
point_id = request.POST.get('point_id', '') |
257 | 265 |
page = request.POST.get('page', 1) |
258 | 266 |
num = request.POST.get('num', 20) |
259 | 267 |
|
260 |
- logs = ThermometerMeasureLogInfo.objects.filter(point_id=point_id, user_id=user_id, status=True) |
|
268 |
+ logs = ThermometerMeasureLogInfo.objects.filter(point_id=point_id, user_id=user_id, member_id=member_id, status=True) |
|
261 | 269 |
count = logs.count() |
262 | 270 |
logs, left = pagination(logs, page, num) |
263 | 271 |
|
@@ -5,7 +5,7 @@ from django_admin import ReadOnlyModelAdmin |
||
5 | 5 |
|
6 | 6 |
from equipment.models import (AepThermometerMeasureLogInfo, AntigenMeasureLogInfo, IsolationPointFieldPoolInfo, |
7 | 7 |
IsolationPointInfo, IsolationPointUserInfo, ThermometerEquipmentInfo, |
8 |
- ThermometerMeasureLogInfo) |
|
8 |
+ ThermometerMeasureLogInfo, FamilyMemberInfo) |
|
9 | 9 |
|
10 | 10 |
|
11 | 11 |
class IsolationPointFieldPoolInfoAdmin(admin.ModelAdmin): |
@@ -20,6 +20,10 @@ class IsolationPointUserInfoAdmin(admin.ModelAdmin): |
||
20 | 20 |
list_display = ('point_id', 'user_id', 'fields', 'observed_days', 'chg_sta', 'temperature', 'last_submit_at', 'leave_at', 'status', 'created_at', 'updated_at') |
21 | 21 |
|
22 | 22 |
|
23 |
+class FamilyMemberInfoAdmin(admin.ModelAdmin): |
|
24 |
+ list_display = ('member_id', 'user_id', 'identity_card_number', 'identity_card_name', 'relation', 'status', 'created_at', 'updated_at') |
|
25 |
+ |
|
26 |
+ |
|
23 | 27 |
class ThermometerEquipmentInfoAdmin(admin.ModelAdmin): |
24 | 28 |
list_display = ('eqpt_id', 'point_id', 'macid', 'sn', 'active_status', 'active_at', 'ipui_pk', 'status', 'created_at', 'updated_at') |
25 | 29 |
list_filter = ('point_id', 'status') |
@@ -45,3 +49,5 @@ admin.site.register(ThermometerEquipmentInfo, ThermometerEquipmentInfoAdmin) |
||
45 | 49 |
admin.site.register(ThermometerMeasureLogInfo, ThermometerMeasureLogInfoAdmin) |
46 | 50 |
admin.site.register(AepThermometerMeasureLogInfo, AepThermometerMeasureLogInfoAdmin) |
47 | 51 |
admin.site.register(AntigenMeasureLogInfo, AntigenMeasureLogInfoAdmin) |
52 |
+admin.site.register(FamilyMemberInfo, FamilyMemberInfoAdmin) |
|
53 |
+ |
@@ -0,0 +1,42 @@ |
||
1 |
+# Generated by Django 3.2.16 on 2022-12-02 06:15 |
|
2 |
+ |
|
3 |
+from django.db import migrations, models |
|
4 |
+import shortuuidfield.fields |
|
5 |
+ |
|
6 |
+ |
|
7 |
+class Migration(migrations.Migration): |
|
8 |
+ |
|
9 |
+ dependencies = [ |
|
10 |
+ ('equipment', '0031_auto_20221128_1653'), |
|
11 |
+ ] |
|
12 |
+ |
|
13 |
+ operations = [ |
|
14 |
+ migrations.CreateModel( |
|
15 |
+ name='FamilyMemberInfo', |
|
16 |
+ fields=[ |
|
17 |
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
18 |
+ ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')), |
|
19 |
+ ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), |
|
20 |
+ ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), |
|
21 |
+ ('member_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='家庭成员唯一标识', max_length=22, null=True, unique=True)), |
|
22 |
+ ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')), |
|
23 |
+ ('identity_card_number', models.CharField(blank=True, help_text='身份证号', max_length=32, null=True, verbose_name='identity_card_number')), |
|
24 |
+ ('identity_card_name', models.CharField(blank=True, help_text='身份证姓名', max_length=32, null=True, verbose_name='identity_card_name')), |
|
25 |
+ ('relation', models.CharField(choices=[('parent', '父母'), ('child', '子女'), ('spouse', '配偶')], db_index=True, default='child', help_text='家庭关系', max_length=32, verbose_name='relative')), |
|
26 |
+ ], |
|
27 |
+ options={ |
|
28 |
+ 'verbose_name': '家庭成员信息', |
|
29 |
+ 'verbose_name_plural': '家庭成员信息', |
|
30 |
+ }, |
|
31 |
+ ), |
|
32 |
+ migrations.AddField( |
|
33 |
+ model_name='isolationpointuserinfo', |
|
34 |
+ name='member_id', |
|
35 |
+ field=models.CharField(blank=True, db_index=True, help_text='家庭成员唯一标识', max_length=32, null=True, verbose_name='member_id'), |
|
36 |
+ ), |
|
37 |
+ migrations.AddField( |
|
38 |
+ model_name='thermometermeasureloginfo', |
|
39 |
+ name='member_id', |
|
40 |
+ field=models.CharField(blank=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='member_id'), |
|
41 |
+ ), |
|
42 |
+ ] |
@@ -112,6 +112,34 @@ class IsolationPointInfo(BaseModelMixin): |
||
112 | 112 |
'qrcode_url': qrcode_url, |
113 | 113 |
} |
114 | 114 |
|
115 |
+class FamilyMemberInfo(BaseModelMixin): |
|
116 |
+ RELATION_TUPLE = ( |
|
117 |
+ ('parent', '父母'), |
|
118 |
+ ('child', '子女'), |
|
119 |
+ ('spouse', '配偶'), |
|
120 |
+ ) |
|
121 |
+ member_id = ShortUUIDField(_('member_id'), max_length=32, blank=True, null=True, help_text='家庭成员唯一标识', db_index=True, unique=True) |
|
122 |
+ user_id = models.CharField(_('user_id'), max_length=32, blank=True, null=True, help_text='用户唯一标识', db_index=True) |
|
123 |
+ identity_card_number = models.CharField(_(u'identity_card_number'), max_length=32, blank=True, null=True, help_text=u'身份证号') |
|
124 |
+ identity_card_name = models.CharField(_(u'identity_card_name'), max_length=32, blank=True, null=True, help_text=u'身份证姓名') |
|
125 |
+ relation = models.CharField(_('relative'), choices=RELATION_TUPLE, default='child', max_length=32, help_text='家庭关系', db_index=True) |
|
126 |
+ |
|
127 |
+ class Meta: |
|
128 |
+ verbose_name = _('家庭成员信息') |
|
129 |
+ verbose_name_plural = _('家庭成员信息') |
|
130 |
+ |
|
131 |
+ def __unicode__(self): |
|
132 |
+ return '%d' % self.pk |
|
133 |
+ |
|
134 |
+ @property |
|
135 |
+ def data(self): |
|
136 |
+ return { |
|
137 |
+ 'member_id': self.member_id, |
|
138 |
+ 'user_id': self.user_id, |
|
139 |
+ 'identity_card_number': self.identity_card_number, |
|
140 |
+ 'identity_card_name': self.identity_card_name, |
|
141 |
+ 'relation': self.relation, |
|
142 |
+ } |
|
115 | 143 |
|
116 | 144 |
class IsolationPointUserInfo(BaseModelMixin): |
117 | 145 |
HAS_NOT_UPLOAD = '未上报' |
@@ -134,6 +162,7 @@ class IsolationPointUserInfo(BaseModelMixin): |
||
134 | 162 |
point_id = models.CharField(_('point_id'), max_length=32, blank=True, null=True, help_text='隔离点唯一标识', db_index=True) |
135 | 163 |
|
136 | 164 |
user_id = models.CharField(_('user_id'), max_length=32, blank=True, null=True, help_text='用户唯一标识', db_index=True) |
165 |
+ member_id = models.CharField(_('member_id'), max_length=32, blank=True, null=True, help_text='家庭成员唯一标识', db_index=True) |
|
137 | 166 |
|
138 | 167 |
fields = JSONField(_('fields'), default=[], blank=True, null=True, help_text='字段信息') |
139 | 168 |
|
@@ -313,6 +342,7 @@ class ThermometerMeasureLogInfo(BaseModelMixin): |
||
313 | 342 |
point_id = models.CharField(_('point_id'), max_length=32, blank=True, null=True, help_text='隔离点唯一标识', db_index=True) |
314 | 343 |
|
315 | 344 |
user_id = models.CharField(_('user_id'), max_length=32, blank=True, null=True, help_text='用户唯一标识') |
345 |
+ member_id = models.CharField(_('member_id'), max_length=32, blank=True, null=True, help_text='用户唯一标识') |
|
316 | 346 |
|
317 | 347 |
macid = models.CharField(_('macid'), max_length=32, blank=True, null=True, help_text='设备号') |
318 | 348 |
sn = models.CharField(_('sn'), max_length=32, blank=True, null=True, help_text='序列号') |